package backend.estructuras.common;

import java.util.*;

import com.dp.client.dto.Fecha;
import com.dp.server.backend.RutaDeVueloBackend;
import com.dp.server.backend.VueloBackend;

public class Ruta implements Comparable<Ruta>{
	Vector<Vuelo> vuelos = new Vector<>();
	Paquete paquete;

	public boolean equals(Object o){
		Ruta r = (Ruta)o;
		return vuelos.equals(r.vuelos);
	}
	public Ruta(List<Vuelo> vuelos, Paquete paquete){
		for(Vuelo vuelo : vuelos){
			this.vuelos.add(vuelo);
		}
		this.paquete = paquete;
	}

	public int getBottleNeck(){
		int res = paquete.getOrigen().getBottleNeckParaIntervaloDeTiempo(paquete.fechaRegistro, vuelos.firstElement().getFechaSalida());
		//res = Math.min(res, paquete.getOrigen().getCapacidadEnInstanteDeTiempo(paquete.fechaRegistro));
		for(Vuelo v : vuelos)
			res = Math.min(res, v.getEspacioRestante());
		
		for(int i = 1; i < vuelos.size() ; i++)
			res = Math.min(res, vuelos.get(i).getConexion().getOrigen().getBottleNeckParaIntervaloDeTiempo(
					vuelos.get(i - 1).getFechaLlegada(), vuelos.get(i).getFechaSalida()));
		return res;
	}
	@Override
	public int compareTo(Ruta otro) {
		return -getBottleNeck() + otro.getBottleNeck(); 
	}

	public void ejecutaRuta() {
		if(vuelos.size() == 0) return;
		paquete.getOrigen().addEstancia(new Estancia(paquete, paquete.fechaRegistro, vuelos.firstElement().getFechaSalida(), this));
		for(int i = 1 ; i < vuelos.size(); i++){
			vuelos.get(i - 1).getConexion().getDestino().addEstancia(
					new Estancia(paquete, vuelos.get(i - 1).getFechaLlegada(), vuelos.get(i).getFechaSalida(), this));
		}
		
		for(Vuelo v : vuelos){
			v.addPaqueteFijo(paquete);
		}
		paquete.setRuta(this);

	}

	public RutaDeVueloBackend toRutaDeVueloBackend() {
		RutaDeVueloBackend ret = new RutaDeVueloBackend();
		for(Vuelo v : this.vuelos){
			VueloBackend vuelo = new VueloBackend();
			vuelo.descripcion = v.getConexion().origen.nombre + " - " + v.getConexion().destino.nombre + ": " + Fecha.toFechaReal(v.fechaVuelo);
			vuelo.idVuelo = v.getId();
			ret.vuelos.add(vuelo);
		}
		return ret;
	}
}
